#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
#define mian main

int lcdfd; //lcd屏幕的文件描述符
int *lcdmem; //lcd屏幕的映射空间

int main()
{
    //用可读可写的方式打开LCD屏幕
    lcdfd = open("/dev/fb0",O_RDWR);
    if(lcdfd == -1)
    {
        perror("open /dev/fb0 failed");
        return -1;
    }

    //映射内存空间
    lcdmem = mmap(NULL, 
                800*480*4, 
                PROT_READ |PROT_WRITE,
                MAP_SHARED,
                lcdfd,
                0);
    if(lcdmem == MAP_FAILED)
    {
        perror("mmap failed");
        return -1;
    }

    //打开bmp图片
    int bmpfd = open("1.bmp",O_RDWR);
    if( bmpfd == -1)
    {
        perror("open 1.bmp failed");
        return -1;
    }

    //先读取54字节头文件
    char headbuf[54];
    read( bmpfd , headbuf , 54);

    //再读取 RGB 颜色数据，图片大小为800*480
    char bmpbuf[800*480*3];
    read( bmpfd , bmpbuf , 800*480*3);

    //因为LCD屏幕是32位,所以需要组合BMP的RGB数据
    int lcdbuf[800*480];
    int i;
    for(i=0;i<800*480;i++)
        lcdbuf[i] =  bmpbuf[3*i+0] | bmpbuf[3*i+1]<<8 | bmpbuf[3*i+2]<<16;

    //把图片显示到开发板上
    int x,y;
    for(x=0;x<800;x++)
        for(y=0;y<480;y++)
            *(lcdmem + x + 800*y) = lcdbuf[x+800*y];

    //关闭文件
    close(bmpfd);
    close(lcdfd);
    munmap(lcdmem,800*480*4);
}